oauth |
您所在的位置:网站首页 › javamail imap › oauth |
Мы пытаемся подключить клиент javamail (1.6) к нашему почтовому ящику office365, размещенному в office365, с использованием аутентификации OAUTH2. Что бы мы ни делали, мы продолжаем получать ошибку A1 NO AUTHENTICATE. Мы зарегистрировали наше приложение в Разрешение API Мы следовали всем инструкциям, изложенным в https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth Включая запуск команд powershell для создания принципала с использованием идентификатора приложения и идентификатора объекта, и мы предоставили приложению полный доступ к почтовому ящику, к которому мы хотим получить доступ. Для аутентификации мы делаем HTTP POST следующим образом, который генерирует токен доступа. Это поток учетных данных клиента с общим секретом, как описано здесь. https://learn .microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-client-creds-grant-flow https://login.microsoftonline.com/{наш идентификатор клиента}/oauth2/v2.0/ жетон с client_id=... client_secret=... grant_type=client_credentials scope=https://outlook.office365.com/.defaultНаша конфигурация javamail mail.store.protocol="imap" mail.imap.host="outlook.office365.com" mail.imap.port="993" mail.imap.ssl.enable="true" mail.imap.starttls.enable="true" mail.imap.auth="true" mail.imap.auth.mechanisms="XOAUTH2" mail.imap.user=""Затем в нашем java-коде мы подключаем хранилище с токеном доступа, полученным из вышеуказанного HTTP POST store.connect(host, user, oauth2_access_token);Мы также попробовали этот скрипт powershell, который возвращает ту же ошибку. https://github.com/DanijelkMSFT/ThisandThat/blob/main/Get-IMAPAccessToken.ps1 Я не считаю, что проблема специфична для JavaMail. Чрезвычайно сложно определить, имеет ли токен доступа правильные права или есть что-то еще, что мешает аутентификации. Что еще мы можем попробовать? Обновление 1 Если мы используем скрипт powershell https://github.com/DanijelkMSFT/ThisandThat/blob/main/Get-IMAPAccessToken.ps1 Передавая только идентификатор клиента и redirectUri, сценарий запрашивает у меня одобрение, и он преуспевает Но если мы используем clientsecret авторизация не работает Обновление 2 Я могу успешно использовать javamail с токеном доступа, сгенерированным сценарием powershell. Очевидно, что токен, созданный с помощью clientsecret, не имеет достаточных прав для доступа к IMAP или почтовому ящику. Я начинаю задаваться вопросом, не работают ли запросы токенов с использованием секрета клиента, потому что в нашей Azure Active Directory включены «параметры безопасности по умолчанию». Возможно, применяется MFA, поэтому любые неинтерактивные запросы блокируются. Обновление 3 https://jwt.ms позволяет декодировать токены доступа Токен, созданный только с идентификатором клиента (поток предоставления кода), сильно отличается от токена, созданного с помощью client_secret (поток учетных данных клиента). В токене из «интерактивного предоставления кода» есть атрибут под названием «scp» Set of Scopes, в котором перечислены области действия независимо от того, что у меня есть в разрешении API моего клиентского приложения ???? "scp": "IMAP.AccessAsUser.All Mail.Read Mail.Read.All Mail.Read.Shared Mail.ReadBasic User.Read"Второй токен из потока учетных данных клиента имеет атрибут «роли», но не имеет областей действия. "roles": ["IMAP.AccessAsApp"]РАЗРЕШЕНО! Глядя на токен доступа, мы заметили, что субъект потока учетных данных клиента (sub) был идентификатором, который мы не настроили. Вот в чем загвоздка: при создании субъекта-службы с помощью powershell в онлайн-обменнике в качестве идентификатора службы вы должны использовать идентификатор объекта корпоративного приложения. New-ServicePrincipal -AppId {clientid} -ServiceId {идентификатор объекта корпоративного приложения -Organization {tenantid} При создании регистрации приложения в Azure AD вы также создаете корпоративное приложение. Идентификатор объекта приложения отличается от идентификатора объекта корпоративного приложения. Поток учетных данных клиента использует идентификатор объекта корпоративного приложения в качестве пользователя, запрашивающего авторизацию. То же самое для предоставления доступа к почтовому ящику с помощью powershell Add-MailboxPermission -Identity {email} -User -ServiceId {идентификатор объекта корпоративного приложения -AccessRights FullAccess Жаль, что процесс аутентификации такой громоздкий oauth-2.0 azure-active-directory office365 jakarta-mail imap 11 Ivan Pedruzzi 23 Авг 2022 в 21:13 Можете ли вы объяснить немного больше, где использовать objectID? Я использую такой код в java: `HttpPost loginPost = new HttpPost("login.microsoftonline.com " + tanantId + "/oauth2/v2.0/токен"); String scopes = "outlook.office365.com/.default"; String encodedBody = "client_id=" + clientId + "&scope=" + scopes + "&client_secret=" + client_secret + "&grant_type=client_credentials"; loginPost.setEntity (новый StringEntity (encodedBody, ContentType.APPLICATION_FORM_URLENCODED)); ` где я должен использовать objectiD здесь? – Ralph 21 Окт 2022 в 18:49 Ральф, objectId используется для создания servicePrincipal в office365. Эти задачи могут выполнять только администраторы вашей учетной записи office365. Существуют сценарии PowerShell, которые необходимо выполнить для создания servicePricipal, которые являются пользователями, выдающими себя за приложения, определенные в Azure Active Directory. – Ivan Pedruzzi 22 Окт 2022 в 20:51 Правильный синтаксис `-User -ServiceId`? – Apostolos 13 Янв 2023 в 11:58 Add-MailboxPermission -Identity {email} -ServiceId {идентификатор объекта корпоративного приложения} -AccessRights FullAccess – Ivan Pedruzzi 13 Янв 2023 в 23:47 1 ответМои два цента по этому поводу: если вы все еще сталкиваетесь с ошибкой аутентификации из-за того, что javamail пытается подключиться к почтовому ящику и читать электронные письма, прежде всего убедитесь, что установка приложения в активном каталоге azure имеет следующие разрешения. IMAP.AccessAsApp Почта.Чтение Mail.Send (для отправки) Во-вторых, создайте субъект-службу с идентификатором корпоративного приложения, как указано в исходном сообщении. После этого проверьте здесь, есть ли у созданного вами токена все роли, которые вы назначили. Даже если вы назначили необходимые роли и можете подключиться к почтовому ящику через powershell, вы все равно можете получить AUTHENTICATE failed от javamail, потому что вы можете неправильно использовать это свойство (mail.imap.auth.mechanisms), замените mail.imap с помощью mail.imaps, и это должно решить проблему. "mail.imaps.auth.mechanisms"="XOAUTH2" "mail.imap.host"="outlookoffice365.com" "mail.smtp.port"=993 "mail.store.protocol"="imaps" session.getStore("imaps") store.connect(host,port,user,token)Удачи !! 0 Yash Keshre 1 Фев 2023 в 18:43 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |